package mercadologico.gui.produto;

import exceptions.PersistenceExceptionMessage;
import fiscal.entities.tables.MoldeProduto;
import generic.gui.util.DefaultFormatterFactoryMask;
import generic.gui.util.FixedLengthDocument;
import generic.gui.util.FocusEstadoTextFormatter;

import java.awt.BorderLayout;
import java.awt.Font;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.ArrayList;

import javax.swing.JFormattedTextField;
import javax.swing.SwingConstants;

import mercadologico.action.ProdutoActionManager;
import mercadologico.entities.tables.Medida;
import mercadologico.entities.tables.Produto;

@SuppressWarnings("serial")
public class ProdutoAdicionarComposicao extends JDialog {

	private static final int MAX_LENGTH_BARRAS = ProdutoCadastro.MAX_LENGTH_BARRAS;
	
	private final JPanel contentPanel = new JPanel();
	private JLabel lblUnidMedida;
	private JComboBox<?> comboBoxUnidMedida;
	private JLabel lblFator;
	private JFormattedTextField formatterFator;
	private JLabel lblBarras;
	private JTextField txtFieldBarras1;
	private JTextField txtFieldBarras2;
	private JLabel label;
	private JLabel lblDimensoDaEmbalagem;
	private JLabel label_2;
	private JLabel label_3;
	private JLabel label_4;
	private JFormattedTextField formatterAltura;
	private JFormattedTextField formatterLargura;
	private JFormattedTextField formatterComprimento;
	private JButton btnSair;
	private JButton btnSalvar;
	private boolean alter = false;
	
	
	
	private Produto produto;
	
	
	private ProdutoActionManager action;
	private JTextField txtVariacao;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			new ProdutoAdicionarComposicao().setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public ProdutoAdicionarComposicao() {
		try {
			setResizable(false);
			setModal(true);
			setTitle("Adicionar Composi\u00E7\u00E3o");
			setBounds(100, 100, 230, 430);
			setLocationRelativeTo(null);
			getContentPane().setLayout(new BorderLayout());
			contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
			getContentPane().add(contentPanel, BorderLayout.CENTER);
			JLabel lblVariao = new JLabel("Varia\u00E7\u00E3o");
			GroupLayout gl_contentPanel = new GroupLayout(contentPanel);
			gl_contentPanel.setHorizontalGroup(
				gl_contentPanel.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_contentPanel.createSequentialGroup()
						.addGap(21)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
							.addGroup(gl_contentPanel.createSequentialGroup()
								.addComponent(getTxtVariacao(), GroupLayout.PREFERRED_SIZE, 171, GroupLayout.PREFERRED_SIZE)
								.addContainerGap())
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
								.addGroup(gl_contentPanel.createSequentialGroup()
									.addComponent(getBtnSalvar(), GroupLayout.PREFERRED_SIZE, 79, GroupLayout.PREFERRED_SIZE)
									.addPreferredGap(ComponentPlacement.RELATED)
									.addComponent(getBtnSair(), GroupLayout.PREFERRED_SIZE, 79, GroupLayout.PREFERRED_SIZE)
									.addContainerGap())
								.addGroup(gl_contentPanel.createSequentialGroup()
									.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
										.addComponent(getLblDimensoDaEmbalagem())
										.addGroup(gl_contentPanel.createParallelGroup(Alignment.TRAILING, false)
											.addComponent(getTxtFieldBarras2(), Alignment.LEADING)
											.addGroup(gl_contentPanel.createSequentialGroup()
												.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
													.addComponent(getComboBoxUnidMedida(), GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE)
													.addComponent(getLblUnidMedida()))
												.addPreferredGap(ComponentPlacement.RELATED)
												.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
													.addComponent(getLblFator())
													.addComponent(getFormatterFator(), GroupLayout.PREFERRED_SIZE, 95, GroupLayout.PREFERRED_SIZE)))
											.addComponent(lblVariao, Alignment.LEADING)
											.addComponent(getTxtFieldBarras1())
											.addGroup(gl_contentPanel.createSequentialGroup()
												.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
													.addComponent(getLabel_2(), GroupLayout.PREFERRED_SIZE, 63, GroupLayout.PREFERRED_SIZE)
													.addComponent(getLabel_3(), GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE)
													.addComponent(getLabel_4(), GroupLayout.PREFERRED_SIZE, 37, GroupLayout.PREFERRED_SIZE))
												.addGap(18)
												.addGroup(gl_contentPanel.createParallelGroup(Alignment.TRAILING, false)
													.addComponent(getFormatterAltura(), 0, 50, Short.MAX_VALUE)
													.addComponent(getFormatterLargura(), 0, 50, Short.MAX_VALUE)
													.addComponent(getFormatterComprimento(), GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE)))
											.addComponent(getLabel(), Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 165, GroupLayout.PREFERRED_SIZE))
										.addComponent(getLblBarras(), GroupLayout.DEFAULT_SIZE, 171, Short.MAX_VALUE))
									.addGap(22)))))
			);
			gl_contentPanel.setVerticalGroup(
				gl_contentPanel.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_contentPanel.createSequentialGroup()
						.addContainerGap()
						.addComponent(lblVariao)
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(getTxtVariacao(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(ComponentPlacement.RELATED)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
							.addComponent(getLblUnidMedida())
							.addComponent(getLblFator()))
						.addPreferredGap(ComponentPlacement.RELATED)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
							.addComponent(getComboBoxUnidMedida(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
							.addComponent(getFormatterFator(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE))
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(getLblBarras())
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(getTxtFieldBarras1(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(getLabel())
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(getTxtFieldBarras2(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
						.addGap(11)
						.addComponent(getLblDimensoDaEmbalagem())
						.addPreferredGap(ComponentPlacement.UNRELATED)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
							.addComponent(getFormatterComprimento(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
							.addComponent(getLabel_2()))
						.addPreferredGap(ComponentPlacement.RELATED)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
							.addComponent(getFormatterLargura(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
							.addComponent(getLabel_3()))
						.addPreferredGap(ComponentPlacement.RELATED)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
							.addComponent(getLabel_4())
							.addComponent(getFormatterAltura(), GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE))
						.addPreferredGap(ComponentPlacement.RELATED, 34, Short.MAX_VALUE)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
							.addComponent(getBtnSair())
							.addComponent(getBtnSalvar()))
						.addGap(20))
			);
			contentPanel.setLayout(gl_contentPanel);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public ProdutoAdicionarComposicao(Produto produto) {
		this();
		setProduto(produto);
		getBtnSalvar().setText("Alterar");
		setFormToAlter(produto);

	}
	public ProdutoAdicionarComposicao(MoldeProduto moldeProduto, Produto produto) {
		this();
		setProduto(produto);
		setFormToCadastro(moldeProduto);
	}

	private void setFormToCadastro(MoldeProduto moldeProduto) {
		getTxtVariacao().setText(getProduto().getVariavel());
		if (moldeProduto != null) {
			getComboBoxUnidMedida().setSelectedItem(moldeProduto.getMedidaCompra());
			getFormatterFator().setValue(moldeProduto.getFatorMedida());
		}
	}

	private void setFormToAlter(Produto produto) {
		getTxtVariacao().setText(produto.getProdutoSimilar().getVariavel());
		getTxtFieldBarras1().setText(produto.getBarra1());
		getTxtFieldBarras2().setText(produto.getBarra2());
		getComboBoxUnidMedida().setSelectedItem(produto.getMedidaCompra());
		getFormatterFator().setValue(produto.getFatorMedidaCompra());
		getFormatterComprimento().setValue(produto.getDimensaoEmbalagemComprimento());
		getFormatterLargura().setValue(produto.getDimensaoEmbalagemLargura());
		getFormatterAltura().setValue(produto.getDimensaoEmbalagemAltura());
	}

	private JLabel getLblUnidMedida() {
		if (lblUnidMedida == null) {
			lblUnidMedida = new JLabel("Unid. Medida");
		}
		return lblUnidMedida;
	}
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private JComboBox<?> getComboBoxUnidMedida() {
		if (comboBoxUnidMedida == null) {
			try {
				ArrayList array = getAction().getArrayMedida();
				array.add(0, "");
				comboBoxUnidMedida = new JComboBox(array.toArray());
			} catch (PersistenceExceptionMessage e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return comboBoxUnidMedida;
	}
	private JLabel getLblFator() {
		if (lblFator == null) {
			lblFator = new JLabel("Fator");
		}
		return lblFator;
	}
	private JFormattedTextField getFormatterFator() {
		if (formatterFator == null) {
			
			formatterFator = new JFormattedTextField();
			formatterFator.setHorizontalAlignment(SwingConstants.RIGHT);
			formatterFator.addFocusListener(new FocusEstadoTextFormatter(formatterFator));
			formatterFator.setValue(new Double(0.00));
			formatterFator.setFormatterFactory(new DefaultFormatterFactoryMask("#,##0.00", new Double(0.00), new Double(999.99)));			
			
			formatterFator.setColumns(10);
		}
		return formatterFator;
	}
	private JLabel getLblBarras() {
		if (lblBarras == null) {
			lblBarras = new JLabel("Barras");
		}
		return lblBarras;
	}
	private JTextField getTxtFieldBarras1() {
		if (txtFieldBarras1 == null) {
			txtFieldBarras1 = new JTextField();
			txtFieldBarras1.setHorizontalAlignment(SwingConstants.CENTER);
			txtFieldBarras1.setColumns(10);
			txtFieldBarras1.setDocument(new FixedLengthDocument(MAX_LENGTH_BARRAS, '0', '9'));
		}
		return txtFieldBarras1;
	}
	private JTextField getTxtFieldBarras2() {
		if (txtFieldBarras2 == null) {
			txtFieldBarras2 = new JTextField();
			txtFieldBarras2.setHorizontalAlignment(SwingConstants.CENTER);
			txtFieldBarras2.setColumns(10);
			txtFieldBarras2.setDocument(new FixedLengthDocument(MAX_LENGTH_BARRAS, '0', '9'));
		}
		return txtFieldBarras2;
	}
	private JLabel getLabel() {
		if (label == null) {
			label = new JLabel("Barras");
		}
		return label;
	}
	private JLabel getLblDimensoDaEmbalagem() {
		if (lblDimensoDaEmbalagem == null) {
			lblDimensoDaEmbalagem = new JLabel("Dimens\u00E3o da Embalagem (cm):");
			lblDimensoDaEmbalagem.setFont(new Font("Tahoma", Font.PLAIN, 11));
		}
		return lblDimensoDaEmbalagem;
	}
	private JLabel getLabel_2() {
		if (label_2 == null) {
			label_2 = new JLabel("Comprimento");
			label_2.setFont(new Font("Tahoma", Font.PLAIN, 11));
		}
		return label_2;
	}
	private JLabel getLabel_3() {
		if (label_3 == null) {
			label_3 = new JLabel("Largura");
			label_3.setFont(new Font("Tahoma", Font.PLAIN, 11));
		}
		return label_3;
	}
	private JLabel getLabel_4() {
		if (label_4 == null) {
			label_4 = new JLabel("Altura");
			label_4.setFont(new Font("Tahoma", Font.PLAIN, 11));
		}
		return label_4;
	}
	private JFormattedTextField getFormatterAltura() {
		if (formatterAltura == null) {
			formatterAltura = new JFormattedTextField();
			formatterAltura.addFocusListener(new FocusEstadoTextFormatter(formatterAltura));
			//formatterAltura.setValue(new Integer(0));
			formatterAltura.setFormatterFactory(new DefaultFormatterFactoryMask("#,##0", new Integer(0), new Integer(99999)));
			formatterAltura.setHorizontalAlignment(SwingConstants.RIGHT);
			formatterAltura.setColumns(10);
		}
		return formatterAltura;
	}
	private JFormattedTextField getFormatterLargura() {
		if (formatterLargura == null) {
			formatterLargura = new JFormattedTextField();
			formatterLargura.addFocusListener(new FocusEstadoTextFormatter(formatterLargura));
			//formatterLargura.setValue(new Integer(0));
			formatterLargura.setFormatterFactory(new DefaultFormatterFactoryMask("#,##0", new Integer(0), new Integer(99999)));
			formatterLargura.setHorizontalAlignment(SwingConstants.RIGHT);
			formatterLargura.setColumns(10);
		}
		return formatterLargura;
	}
	private JFormattedTextField getFormatterComprimento() {
		if (formatterComprimento == null) {
			formatterComprimento = new JFormattedTextField();
			formatterComprimento.addFocusListener(new FocusEstadoTextFormatter(formatterComprimento));
			//formatterComprimento.setValue(new Integer(0));
			formatterComprimento.setFormatterFactory(new DefaultFormatterFactoryMask("#,##0", new Integer(0), new Integer(99999)));			
			formatterComprimento.setHorizontalAlignment(SwingConstants.RIGHT);
			formatterComprimento.setColumns(10);
		}
		return formatterComprimento;
	}
	private JButton getBtnSair() {
		if (btnSair == null) {
			btnSair = new JButton("Sair");
			btnSair.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					setProduto(null);
					dispose();
				}
			});
		}
		return btnSair;
	}
	private JButton getBtnSalvar() {
		if (btnSalvar == null) {
			btnSalvar = new JButton("Salvar");
			btnSalvar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if (getBtnSalvar().getText().equals("Salvar")) {
						setProdutoFromForm();
					} else {
						alterProduto();
					}
					dispose();
				}

			});
		}
		return btnSalvar;
	}

	private void alterProduto() {
		setProdutoFromForm();
		setAlter(true);
	}
	private void setProdutoFromForm() {
		//getProduto().setVariavel(getTxtVariacao().getText());
		getProduto().setBarra1(getTxtFieldBarras1().getText());
		getProduto().setBarra2(getTxtFieldBarras2().getText());
		getProduto().setMedidaCompra((Medida) getComboBoxUnidMedida().getSelectedItem());
		getProduto().setFatorMedidaCompra((Double) getFormatterFator().getValue());
		getProduto().setDimensaoEmbalagemComprimento((Integer) getFormatterComprimento().getValue());
		getProduto().setDimensaoEmbalagemLargura((Integer) getFormatterLargura().getValue());
		getProduto().setDimensaoEmbalagemAltura((Integer) getFormatterAltura().getValue());
	}

	public ProdutoActionManager getAction() {
		if (action == null) {
			action = new ProdutoActionManager();
		}
		return action;
	}

	public void setAction(ProdutoActionManager action) {
		this.action = action;
	}
	private JTextField getTxtVariacao() {
		if (txtVariacao == null) {
			txtVariacao = new JTextField();
			txtVariacao.setEditable(false);
			txtVariacao.setHorizontalAlignment(SwingConstants.LEFT);
			txtVariacao.setColumns(10);
		}
		return txtVariacao;
	}

	public boolean isAlter() {
		return this.alter;
	}
	public void setAlter(boolean alter) {
		this.alter = alter;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}
}
